// import Vue from 'vue'

export default {
	//公共方法
	//方法名 ajax
	//传入参数 opt={url:"uri位置(不包含域名部分及'/')",data:"传入参数,JSON类型",method:"方法,默认:POST",header:"头部信息",success:"成功时回调"}
	ajax: function(opt) {
		opt = opt || {};
		opt.url = opt.url || '';
		opt.data = opt.data || null;
		opt.method = opt.method || 'POST';
		opt.header = opt.header || {
			"Content-Type": "application/json"
		};
		opt.success = opt.success || function() {
			uni.showToast({
				title: '请求成功,但未设置成功时回调'
			});
		};
		opt.fail = opt.success || function() {
			uni.showToast({
				title: '请求失败,但未设置失败时回调'
			});
		};
	},
	checkEmail: checkEmail,
	checkMobile: checkMobile,
	getAreaCode: getAreaCode,
	isInArray: isInArray,
	add: add,
	subtract: subtract,
	multiply: multiply,
	divide: divide,
	xmTypeToStr: xmTypeToStr,
	goToPage: goToPage,
	trim: trim,
	enOrNum: enOrNum,
	diquStr: diquStr,
	timeFrom2: timeFrom2,
	timeFormat1: timeFormat1

}

//校验手机格式
function checkMobile(mobile) {
	return RegExp(/^1[123456789]\d{9}$/).test(mobile);
}
//校验邮箱格式
function checkEmail(email) {
	return RegExp(/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/).test(
		email);
}

//数组中是否包含某元素
function isInArray(arr, value) {
	for (var i = 0; i < arr.length; i++) {
		if (value === arr[i]) {
			return true;
		}
	}
	return false;
}

/// 通过地区名字 获取地区代码
function getAreaCode(name) {
	var diquCode = '';
	switch (name) {
		case "北京":
			diquCode = "110000";
			break;
		case "山东":
			diquCode = "370000";
			break;
		case "浙江":
			diquCode = "330000";
			break;
		case "上海":
			diquCode = "310000";
			break;
		case "河南":
			diquCode = "410000";
			break;
		case "天津":
			diquCode = "120000";
			break;
		case "湖南":
			diquCode = "430000";
			break;
		case "重庆":
			diquCode = "500000";
			break;
		case "湖北":
			diquCode = "420000";
			break;
		case "黑龙江":
			diquCode = "230000";
			break;
		case "四川":
			diquCode = "510000";
			break;
		case "吉林":
			diquCode = "220000";
			break;
		case "贵州":
			diquCode = "520000";
			break;
		case "辽宁":
			diquCode = "210000";
			break;
		case "云南":
			diquCode = "530000";
			break;
		case "河北":
			diquCode = "130000";
			break;
		case "广东":
			diquCode = "440000";
			break;
		case "内蒙古":
			diquCode = "150000";
			break;
		case "广西":
			diquCode = "450000";
			break;
		case "山西":
			diquCode = "140000";
			break;
		case "福建":
			diquCode = "350000";
			break;
		case "陕西":
			diquCode = "610000";
			break;
		case "甘肃":
			diquCode = "620000";
			break;
		case "宁夏":
			diquCode = "640000";
			break;
		case "安徽":
			diquCode = "340000";
			break;
		case "西藏":
			diquCode = "540000";
			break;
		case "江西":
			diquCode = "360000";
			break;
		case "新疆":
			diquCode = "650000";
			break;
		case "江苏":
			diquCode = "320000";
			break;
		case "青海":
			diquCode = "630000";
			break;
		case "海南":
			diquCode = "460000";
			break;
		case "台湾":
			diquCode = "710000";
			break;
		case "香港":
			diquCode = "810000";
			break;
		case "澳门":
			diquCode = "820000";
			break;
	}
	return diquCode;
}

/*根据编码判断项目类型*/
function xmTypeToStr(type) {
	var str = '';
	switch (type) {
		case 3893:
			str = '住宅社区'
			break;
		case 4664:
			str = '移动通信'
			break;
		case 3894:
			str = '文化体育'
			break;
		case 3895:
			str = '展览观演'
			break;
		case 3904:
			str = '卫生医疗'
			break;
		case 3905:
			str = '酒店餐饮'
			break;
		case 3906:
			str = '工业建筑'
			break;
		case 3910:
			str = '行政办公'
			break;
		case 4186:
			str = '城市规划'
			break;
		case 3914:
			str = '公用建筑'
			break;
		case 3912:
			str = '环保节能'
			break;
		case 3911:
			str = '水利工程'
			break;
		case 3890:
			str = '生产制造'
			break;
		case 3891:
			str = '能源化工'
			break;
		case 3892:
			str = '农林牧渔'
			break;
		case 4303:
			str = '交通运输'
			break;
		case 4304:
			str = '桥梁/栈桥'
			break;
		case 4305:
			str = '地铁'
			break;
		case 4307:
			str = '高速公路'
			break;
		case 4306:
			str = '铁路'
			break;
		case 4308:
			str = '道路工程'
			break;
		case 4309:
			str = '隧道'
			break;
		case 4310:
			str = '轨道交通'
			break;
		case 4510:
			str = '水路航道'
			break;
		case 4703:
			str = '政府招商'
			break;
		case 0:
			str = '全部工程类别'
			break;
		default:
			str = '未知'
			break;
	}
	return str;
}

/*
 * 判断obj是否为一个整数
 */
function isInteger(obj) {
	return Math.floor(obj) === obj
}

/*
 * 将一个浮点数转成整数，返回整数和倍数。如 3.14 >> 314，倍数是 100
 * @param floatNum {number} 小数
 * @return {object}
 *   {times:100, num: 314}
 */
function toInteger(floatNum) {
	var ret = {
		times: 1,
		num: 0
	}
	if (isInteger(floatNum)) {
		ret.num = floatNum
		return ret
	}
	var strfi = floatNum + ''
	var dotPos = strfi.indexOf('.')
	var len = strfi.substr(dotPos + 1).length
	var times = Math.pow(10, len)
	var intNum = parseInt(floatNum * times + 0.5, 10)
	ret.times = times
	ret.num = intNum
	return ret
}

/*
 * 核心方法，实现加减乘除运算，确保不丢失精度
 * 思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）
 *
 * @param a {number} 运算数1
 * @param b {number} 运算数2
 * @param digits {number} 精度，保留的小数点数，比如 2, 即保留为两位小数
 * @param op {string} 运算类型，有加减乘除（add/subtract/multiply/divide）
 *
 */
function operation(a, b, digits, op) {
	var o1 = toInteger(a)
	var o2 = toInteger(b)
	var n1 = o1.num
	var n2 = o2.num
	var t1 = o1.times
	var t2 = o2.times
	var max = t1 > t2 ? t1 : t2
	var result = null
	switch (op) {
		case 'add':
			if (t1 === t2) { // 两个小数位数相同
				result = n1 + n2
			} else if (t1 > t2) { // o1 小数位 大于 o2
				result = n1 + n2 * (t1 / t2)
			} else { // o1 小数位 小于 o2
				result = n1 * (t2 / t1) + n2
			}
			return result / max
		case 'subtract':
			if (t1 === t2) {
				result = n1 - n2
			} else if (t1 > t2) {
				result = n1 - n2 * (t1 / t2)
			} else {
				result = n1 * (t2 / t1) - n2
			}
			return result / max
		case 'multiply':
			result = (n1 * n2) / (t1 * t2)
			return result
		case 'divide':
			result = (n1 / n2) * (t2 / t1)
			return result
	}
}

// 加减乘除的四个接口
function add(a, b, digits) {
	return operation(a, b, digits, 'add')
}

function subtract(a, b, digits) {
	return operation(a, b, digits, 'subtract')
}

function multiply(a, b, digits) {
	return operation(a, b, digits, 'multiply')
}

function divide(a, b, digits) {
	return operation(a, b, digits, 'divide')
}

function gotourl(type, link) {
	if (type == 'tab') {
		uni.switchTab({
			url: link
		})
	} else if (type == 'nav') {
		// console.log(11,link)
		uni.navigateTo({
			url: link
		})
	}
}

function goToPage(checklogin, type, url) {
	if (checklogin) {
		Vue.prototype.checkLogin();
		if (this.currUser.islogin) {
			gotourl(type, url)
		} else {
			url = encodeURIComponent(url);
			uni.navigateTo({
				url: '/pages/user/login/login1?type=' + type + '&fromurl=' + encodeURIComponent(url)
			})
		}
	} else {
		gotourl(type, url)
	}
}

//删除左右两端的空格
function trim(str) {
	return str.replace(/(^\s*)|(\s*$)/g, "");
}
/**
 * 只能是字母或者数字
 */
function enOrNum(value) {
	// 英文或者数字
	const reg = /^[0-9a-zA-Z]*$/g
	return reg.test(value)
}

// 地区
function diquStr(name1, name2) {
	if (name2 && name2 !== '' && name2 !== name1 && !name2.includes(name1)) {
		return name1 + '-' + name2
	} else {
		return name1
	}
}

/**
 * @description 格式化时间
 * @param {String|Number} dateTime 需要格式化的时间戳
 * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd
 * @returns {string} 返回格式化后的字符串
 */
function timeFormat1(dateTime = null, fmt = 'yyyy-mm-dd') {
	// 如果为null,则格式化当前时间
	if (!dateTime) dateTime = Number(new Date())
	// 如果dateTime长度为10或者13，则为秒和毫秒的时间戳，如果超过13位，则为其他的时间格式
	if (dateTime.toString().length == 10) dateTime *= 1000
	const date = new Date(dateTime)
	let ret
	const opt = {
		'y+': date.getFullYear().toString(), // 年
		'm+': (date.getMonth() + 1).toString(), // 月
		'd+': date.getDate().toString(), // 日
		'h+': date.getHours().toString(), // 时
		'M+': date.getMinutes().toString(), // 分
		's+': date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	}
	for (const k in opt) {
		ret = new RegExp(`(${k})`).exec(fmt)
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
		}
	}
	return fmt
}

function timeFrom2(timestamp = null, format = 'yyyy-mm-dd') {
	if (timestamp == null) timestamp = Number(new Date())
	timestamp = +new Date(timestamp)
	// 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)
	if (timestamp.toString().length == 10) timestamp *= 1000
	let timer = (new Date()).getTime() - timestamp
	timer = parseInt(timer / 1000)
	// 如果小于5分钟,则返回"刚刚",其他以此类推
	let tips = ''
	switch (true) {
		case timer < 300:
			tips = '刚刚'
			break
			// 1小时内，和策划确认1小时内的时候突出显示
		case timer >= 300 && timer < 3600:
			tips = `${parseInt(timer / 60)}分钟前`
			break
		default:
			// 如果format为false，则无论什么时间戳，都显示xx之前
			tips = timeFormat1(timestamp, format)
	}
	return tips
}